মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট (C++11)

Computer Programming - সি++ প্রোগ্রামিং (C++ Programming) অ্যাডভান্সড টপিকস |
201
201

মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর C++11 থেকে চালু করা হয়, যা ডাটা মেম্বারগুলোর রিসোর্স বা মেমোরি স্থানান্তর করতে সহায়ক। এটি মূলত রিসোর্স ইনটেনসিভ অবজেক্ট (যেমন, বড় অ্যারে বা ডাইনামিক মেমোরি) ব্যবহারের ক্ষেত্রে কাজকে দ্রুততর করে। সাধারণত, মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর এমন ক্লাসের জন্য প্রয়োজন হয়, যা ডাইনামিক মেমোরি ব্যবহারের মাধ্যমে কাজ করে।

মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্টের প্রয়োজনীয়তা

C++ এ সাধারণত অবজেক্ট কপি করার সময় কপি কনস্ট্রাক্টর এবং কপি অ্যাসাইনমেন্ট অপারেটর ব্যবহৃত হয়। কিন্তু কপি করার ক্ষেত্রে সম্পূর্ণ ডেটা কপি করতে হয়, যা সময়সাপেক্ষ এবং মেমোরি ইনটেনসিভ হতে পারে। মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর এই সমস্যার সমাধান করে, কারণ তারা কপি না করে ডেটার মালিকানা (ownership) স্থানান্তর করে।

মুভ কনস্ট্রাক্টর (Move Constructor)

মুভ কনস্ট্রাক্টর ব্যবহার করে একটি অবজেক্ট তৈরি করা হলে, এটি মূল অবজেক্টের ডেটার মালিকানা নিয়ে নেয় এবং মূল অবজেক্টটিকে null বা nullptr করে দেয়। ফলে ডেটা স্থানান্তর সহজ এবং দ্রুত হয়।

মুভ কনস্ট্রাক্টর সিনট্যাক্স

ClassName(ClassName&& other);
  • এখানে ClassName&& হলো রাইট ভ্যালু রেফারেন্স (rvalue reference), যা মুভ অপারেশন সমর্থন করে।

উদাহরণ: মুভ কনস্ট্রাক্টর ব্যবহার

#include <iostream>
#include <utility> // std::move এর জন্য
using namespace std;

class MyClass {
    int* data;
public:
    // কনস্ট্রাক্টর
    MyClass(int value) {
        data = new int(value);
        cout << "Constructor called!" << endl;
    }

    // মুভ কনস্ট্রাক্টর
    MyClass(MyClass&& other) noexcept : data(other.data) {
        other.data = nullptr; // মূল অবজেক্টটিকে null করে দেওয়া
        cout << "Move Constructor called!" << endl;
    }

    // ডেস্ট্রাক্টর
    ~MyClass() {
        delete data;
        cout << "Destructor called!" << endl;
    }

    int getValue() const {
        return *data;
    }
};

int main() {
    MyClass obj1(42); // সাধারণ কনস্ট্রাক্টর কল
    MyClass obj2 = std::move(obj1); // মুভ কনস্ট্রাক্টর কল

    cout << "Value of obj2: " << obj2.getValue() << endl; // Output: Value of obj2: 42

    return 0;
}

বর্ণনা:

  • এখানে MyClass(MyClass&& other) হলো মুভ কনস্ট্রাক্টর, যা obj1 থেকে obj2 তে ডেটার মালিকানা সরিয়ে নেয়।
  • std::move(obj1) ব্যবহার করে obj1 থেকে মালিকানা obj2 তে স্থানান্তর করা হয়েছে।
  • এর ফলে obj1 এর data পয়েন্টার nullptr হয়ে যায় এবং অবশেষে যখন obj1 ডেস্ট্রয় হয়, তখন ডেটা ডিলিট হবে না, কারণ এর মালিকানা ইতিমধ্যে obj2 এর কাছে চলে গেছে।

মুভ অ্যাসাইনমেন্ট অপারেটর (Move Assignment Operator)

মুভ অ্যাসাইনমেন্ট অপারেটর মুভ কনস্ট্রাক্টরের মতোই কাজ করে, তবে এটি ইতোমধ্যে বিদ্যমান অবজেক্টকে অন্য অবজেক্টের মালিকানা প্রদান করে।

মুভ অ্যাসাইনমেন্ট অপারেটর সিনট্যাক্স

ClassName& operator=(ClassName&& other);

উদাহরণ: মুভ অ্যাসাইনমেন্ট অপারেটর ব্যবহার

#include <iostream>
#include <utility>
using namespace std;

class MyClass {
    int* data;
public:
    // কনস্ট্রাক্টর
    MyClass(int value) {
        data = new int(value);
        cout << "Constructor called!" << endl;
    }

    // মুভ কনস্ট্রাক্টর
    MyClass(MyClass&& other) noexcept : data(other.data) {
        other.data = nullptr;
        cout << "Move Constructor called!" << endl;
    }

    // মুভ অ্যাসাইনমেন্ট অপারেটর
    MyClass& operator=(MyClass&& other) noexcept {
        if (this != &other) { // সেলফ-অ্যাসাইনমেন্ট চেক
            delete data; // পুরানো ডেটা মুক্ত করা
            data = other.data;
            other.data = nullptr;
            cout << "Move Assignment called!" << endl;
        }
        return *this;
    }

    // ডেস্ট্রাক্টর
    ~MyClass() {
        delete data;
        cout << "Destructor called!" << endl;
    }

    int getValue() const {
        return *data;
    }
};

int main() {
    MyClass obj1(42);
    MyClass obj2(100);
    obj2 = std::move(obj1); // মুভ অ্যাসাইনমেন্ট অপারেটর কল

    cout << "Value of obj2: " << obj2.getValue() << endl; // Output: Value of obj2: 42

    return 0;
}

বর্ণনা:

  • এখানে operator=(MyClass&& other) মুভ অ্যাসাইনমেন্ট অপারেটর, যা obj1 থেকে obj2 এ ডেটার মালিকানা স্থানান্তর করে।
  • delete data; দিয়ে পূর্ববর্তী ডেটা ডিলিট করে নতুন মালিকানা obj1 থেকে স্থানান্তর করা হয়েছে।

মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর ব্যবহার করার সুবিধা

দ্রুত কার্য সম্পাদন: ডেটা কপি না করে সরাসরি মালিকানা স্থানান্তরের মাধ্যমে অপারেশন দ্রুত সম্পন্ন হয়।

মেমোরি সাশ্রয়: কপি করার চেয়ে মালিকানা স্থানান্তর কম মেমোরি ব্যবহার করে, বিশেষত বড় অবজেক্টের ক্ষেত্রে।

রিসোর্স ম্যানেজমেন্ট উন্নত করা: মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর রিসোর্স ইনটেনসিভ অবজেক্ট ম্যানেজমেন্টে কার্যকর ভূমিকা রাখে।

মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর প্রয়োগ করার সময় সতর্কতা

রাইট ভ্যালু রেফারেন্স: মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটরে রাইট ভ্যালু রেফারেন্স (&&) ব্যবহার করতে হবে।

null বা nullptr: মুভের পরে, মূল অবজেক্টের ডেটা পয়েন্টার nullptr এ সেট করা উচিত, যেন ডাবল ডিলিট এড়ানো যায়।

সেলফ-অ্যাসাইনমেন্ট চেক: মুভ অ্যাসাইনমেন্ট অপারেটরের ক্ষেত্রে সেলফ-অ্যাসাইনমেন্ট চেক করা গুরুত্বপূর্ণ, যাতে একই অবজেক্টে মুভ করে ডেটা ডিলিট না হয়ে যায়।

সারসংক্ষেপ

  • মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর C++11 এর একটি গুরুত্বপূর্ণ ফিচার, যা অবজেক্টের মালিকানা স্থানান্তর করে ডেটা কপি না করে।
  • মুভ অপারেশন ব্যবহার করে ডেটা স্থানান্তর দ্রুততর ও মেমোরি সাশ্রয়ী করা যায়।

মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর রিসোর্স ইনটেনসিভ কাজগুলোর জন্য অত্যন্ত কার্যকর, কারণ এটি প্রোগ্রামকে আরও কার্যকর ও দ্রুততর করে তোলে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion